

// //测试一，测试全局变量在闭包中的情况
// let count = 0;
// function makeCounter()
// {
//     function counter(){
//         count += 1;
//         return count;
//     }
//     return counter;
// }
//
// let counter1 = makeCounter();
// let counter2 = makeCounter();
// console.log("run counter1 get value:" + counter1());//1
// console.log("run counter1 get value:" + counter1());//2
// console.log("run counter2 get value:" + counter2());//3
// console.log("curr 全局变量 count value:"+ count); // 3
// //测试可见，都是对的一个变量的操作，没能各自环境一份


// //测试二，一个所谓的自由变量，非全局且非闭包函数体内定义的局部变量。
// function makeCounter()
// {
//     let count = 0;
//     function counter(){
//         count += 1;
//         return count;
//     }
//     return counter;
// }
//
// let counter1 = makeCounter();
// let counter2 = makeCounter();
// console.log("run counter1 get value:" + counter1());//1
// console.log("run counter1 get value:" + counter1());//2
// console.log("run counter2 get value:" + counter2());//1
// console.log("curr 全局变量 count value:"+ count); // 这句报错
// //输出结果：
// // closure_code.js:36 run counter1 get value:1
// // closure_code.js:37 run counter1 get value:2
// // closure_code.js:38 run counter2 get value:1
// // closure_code.js:39 Uncaught ReferenceError: count is not defined
// //     at closure_code.js:39:39
// // (anonymous) @ closure_code.js:39
// //可见不同的闭包中的 count 隔离开了，有自己的一份。

// function handler(){ //测试三，书上的一个例子，【1】，p501
//     alert(doneMessage);
// }
// function makeTimer(doneMessage, n) {
//     setTimeout(handler, n);
// }
// makeTimer("测试参数字符串", 1000);
// //输出结果：
// // closure_code.js:50 Uncaught ReferenceError: doneMessage is not defined
// //     at handler (closure_code.js:50:11)
// // handler @ closure_code.js:50
// // setTimeout
// // makeTimer @ closure_code.js:53
// // (anonymous) @ closure_code.js:55



// //测试四，闭包声明后（返回前）修改其所包含环境的变量值。
// function makeCounter()
// {
//     let count = 0;
//     function counter(){
//         count += 1;
//         return count;
//     }
//     count = 10;
//     return counter;
// }
//
// let counter1 = makeCounter();
// console.log("run counter1 get value:" + counter1());//11
// console.log("run counter1 get value:" + counter1());//12




// //测试五，闭包声明后（返回前）修改其所包含环境的变量值。
// function makeCounter()
// {
//     let count = 0;
//     function counter(paramTag){
//         count += 1;
//         return paramTag + count;
//     }
//     console.log(counter("里面第一次：")); // 1
//     count = 10;
//     console.log(counter("里面第二次：")); // 11
//     return counter;
// }
//
// let counter1 = makeCounter();
// console.log("run counter1 get value:" + counter1("外面第一次："));//12
// console.log("run counter1 get value:" + counter1("外面第二次："));//13



//测试六，闭包声明后（返回前）修改其所包含环境的变量值。==继续折腾
function makeCounter()
{
    let count = 0;
    function counter(paramTag){
        count += 1;
        return paramTag + count;
    }
    console.log(counter("里面第一次：")); // 1
    count = 10;
    console.log(counter("里面第二次：")); // 11
    return counter;
}

let counter1 = makeCounter();
let counter2 = makeCounter();
console.log("run counter1 get value:" + counter1("外面1第一次："));//12
console.log("run counter1 get value:" + counter1("外面1第二次："));//13
console.log("run counter2 get value:" + counter2("外面2第一次："));//12
console.log("run counter2 get value:" + counter2("外面2第二次："));//13
// 输出结果：
// closure_code.js:113 里面第一次：1
// closure_code.js:115 里面第二次：11
// closure_code.js:113 里面第一次：1
// closure_code.js:115 里面第二次：11
// closure_code.js:121 run counter1 get value:外面1第一次：12
// closure_code.js:122 run counter1 get value:外面1第二次：13
// closure_code.js:123 run counter2 get value:外面2第一次：12
// closure_code.js:124 run counter2 get value:外面2第二次：13


